import type {ValidationRule} from "@/components/input/type/ValidationRules.ts";

/**
 * created by yangtong on 2025/6/19 下午10:07
 * <br />
 * 表单项
 */
export default interface FormItem<T extends Record<string, any> = Record<string, any>> {

    /**
     * 表单项的key，该表单项将通过key找到modelValue对应字段，然后进行双向绑定
     */
    key: keyof T & string

    /**
     * 表单项标题
     */
    label?: string

    /**
     * 表单项标题宽度
     */
    labelWidth?: number

    /**
     * 表单项起始行，下标从0开始
     */
    row: number

    /**
     * 表单项横跨的总列数
     */
    span?: number

    /**
     * 表单项占据的总行数（默认1）
     */
    rowSpan?: number

    /**
     * 距离当前行上一个表单项的位移
     */
    offset?: number

    /**
     * 字段类型，默认div，其中slot表示由使用者通过命名插槽的方式来指定该表单项的内容
     */
    type?: 'input' | 'number' | 'password' | 'textarea' | 'switch' | 'select' | 'radio' | 'checkbox' | 'slot' | 'div'

    /**
     * 是否禁用
     */
    disabled?: boolean

    /**
     * 仅适用于select/radio/checkbox
     */
    options?: { label: string; value: string | number | boolean; type?: string }[]

    /**
     * 仅适用于input组件,使用内置校验规则，通过规则名称数组指定
     * 例如: ['required', 'email', 'minLength:3', 'maxLength:50']
     */
    useRules?: ValidationRule[]

    /**
     * 仅适用于input组件，表示其校验规则
     */
    rules?: ((val: string) => true | string)[]

    /**
     * 仅适用于input组件，是否必填
     */
    required?: boolean

    /**
     * 仅适用于input组件，提示词
     */
    placeholder?: string

    /**
     * 表单项的其他属性
     */
    attr?: Record<string, any>

    /**
     * 表单项的事件
     */
    event?: Record<string, (...args: any[]) => void>
}